import { useMemberStore } from '@/stores'

// 参考文档：https://uniapp.dcloud.net.cn/api/interceptor.html
const httpInterceptors = {
  // invoke: 拦截前触发
  invoke(options: any) {
    // 判断路径是否以 http 开始
    if (!options.url.startsWith('http')) {
      // request 触发前拼接 url
      options.url = 'https://pcapi-xiaotuxian-front-devtest.itheima.net' + options.url
    }

    // 设置超时时间
    options.timeout = 15000
    // 设置请求头
    options.header = { ...options.header, 'source-client': 'miniapp ' }

    const store = useMemberStore()
    // 如果token存在
    if (store.profile?.token) {
      options.header.Authorization = store.profile.token
    }
  },
}
uni.addInterceptor('request', httpInterceptors)
uni.addInterceptor('uploadFile', httpInterceptors)

interface ResultData<T> {
  code: string
  msg: string
  result: T
}

// 结论：http函数的泛型 就是 接口返回的result数据的类型
export default function http<T>(options: UniApp.RequestOptions): Promise<T> {
  return new Promise((resolve, reject) => {
    uni.request({
      ...options, // url data method header
      success: (res) => {
        // 解第一层数据：res.data 是接口的返回值
        const data = res.data as ResultData<T>
        // 网络请求成功20x
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 业务处理失败的情况
          if (data.code !== '1') {
            uni.showToast({
              title: data.msg || '网络异常，请重试',
              icon: 'none',
            })
            reject(data)
          }
          resolve(data.result)
        }
        // 网络异常
        else {
          // 401错误处理
          if (res.statusCode === 401) {
            const pages = getCurrentPages()
            const lastPage = pages[pages.length - 1]
            uni.redirectTo({
              url: '/pages/login/login?redirectUrl=/' + lastPage.route,
            })
            return
          }
        }
      },
      fail: (err: any) => {
        uni.showToast({
          title: '网络错误请重试',
          icon: 'error',
          mask: true,
        })
        reject(err)
      },
    })
  })
}

uni.http = http
